package com.team2.outpatient_sys.dao;

import com.team2.outpatient_sys.pojo.Authority;
import com.team2.outpatient_sys.pojo.Role;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface RoleDao {
    /**
     * 查询所有数据库中的角色信息
     * @return 查询到的所有角色信息的封装对象的集合
     */
    @Select("SELECT * FROM `role` ORDER BY `id` ASC")
    List<Role> queryAll();

    /**
     * 根据角色名称字段在数据库中查询指定角色信息
     * @param roleName 需要查询的角色的名称字段值
     * @return 查询到的角色信息的封装对象
     */
    @Select("SELECT * FROM `role` WHERE `name`=#{roleName}")
    Role queryByRoleName(String roleName);

    /**
     * 根据角色的主键id字段在数据库中查询指定角色所拥有的所有权限信息
     * @param roleId 需要查询的角色的id字段值
     * @return 查询到指定角色拥有的权限信息封装对象的集合
     */
    @Select("SELECT a.* FROM `authority` AS a JOIN `role_authority` AS ra ON a.`id`=ra.`authority_id` JOIN `role` AS r ON ra.`role_id`=r.`id` WHERE r.`id`=#{roleId}")
    List<Authority> queryAuthoritiesById(Integer roleId);

    /**
     * 根据角色的name字段在数据库中查询指定角色所拥有的所有权限的url
     * @param roleName 需要查询的角色的name字段值
     * @return 查询到的指定角色拥有的权限的url字符串的集合
     */
    @Select("SELECT a.url FROM `authority` AS a JOIN `role_authority` AS ra ON a.`id`=ra.`authority_id` JOIN `role` AS r ON ra.`role_id`=r.`id` WHERE r.`name`=#{roleName}")
    List<String> queryAuthorityUrlsByName(String roleName);

    /**
     * 根据角色id删除对应的角色-权限表中的所有数据
     * 用于删除角色拥有的所有权限
     * @param roleId 需要删除数据的角色id
     * @return 根据角色id删除角色-权限表中的数据所影响的行数
     */
    @Delete("DELETE FROM `role_authority` WHERE `role_id`=#{roleId}")
    int deleteAuthorityById(Integer roleId);

    /**
     * 往角色权限表中插入一条新的记录
     * 用于为角色新增一个权限
     * @param roleId 插入role_id字段值
     * @param authorityId 插入的authority_id字段值
     * @return 往角色权限表中插入新记录所影响的表行数
     */
    @Insert("INSERT INTO `role_authority` VALUES (#{roleId}, #{authorityId});")
    int insertAuthority(@Param("roleId") Integer roleId, @Param("authorityId") Integer authorityId);
}
